package com.been.common.service;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

/**
 * 通用service，所有service的基类。 <br/>
 * 如果一个具体功能并不能确定维护的是哪张表或哪个javabean的时候，那么可以不用定义他的泛型化service，直接使用此类即可
 * 
 * @author been 2011-10-02
 */
public interface PublicService {

	/**
	 * 保存对象
	 * 
	 * @param object
	 */
	void save(Object object);

	/**
	 * 删除对象
	 * 
	 * @param object
	 */
	void delete(Object object);

	/**
	 * 根据类型和对象id删除一个对象
	 * 
	 * @param <M>
	 * @param clazz
	 *            类型
	 * @param id
	 *            对象ID
	 */
	<M> void delete(Class<M> clazz, Serializable id);

	/**
	 * 更新对象
	 * 
	 * @param object
	 */
	void update(Object object);

	/**
	 * 用语句更新记录
	 * 
	 * @param queryString
	 *            查询语句
	 * @param parameters
	 *            参数
	 */
	void updateByQuery(String queryString, Object[] parameters);

	/**
	 * 根据传进来的CLASS，查询ID的对象
	 * 
	 * @param entityClass
	 *            需要查询的实体对象
	 * @param id
	 *            序列化ID
	 * @return entityClass 对应的对象
	 */
	<M> M find(Class<M> entityClass, Serializable id);

	/**
	 * 根据HQL查询对象为 entityClass对象
	 * 
	 * @param entityClass
	 *            需要查询的实体对象
	 * @param hql
	 *            查询的HQL
	 * @return entityClass 对应的对象 集合
	 */
	<M> List<M> find(Class<M> entityClass, String hql);

	/**
	 * 根据hql构造Query
	 * 
	 * @param hql
	 *            字符串
	 * @return Query 查询对象
	 */
	Query createQuery(String hql);

	/**
	 * 根据hql构造Query
	 * 
	 * @param sql
	 *            字符串
	 * @return Query 查询对象
	 */
	Query createSQLQuery(String sql);

	/**
	 * 得到当前hibernate的session
	 * 
	 * @return
	 */
	Session getCurSession();

	/**
	 * 删除对象集合
	 * 
	 * @param objList
	 */
	<M> void deleteAll(List<M> objList);

	/**
	 * 根据类型和对象id载入一个对象
	 * 
	 * @param entityClass
	 *            类型
	 * @param id
	 *            对象ID
	 * @return 加载的对象
	 */
	<M> M load(Class<M> entityClass, Serializable id);

	/**
	 * 根据类型和对象id从数据库取得一个对象
	 * 
	 * @param entityClass
	 *            类型
	 * @param id
	 *            对象ID
	 * @return 加载的对象
	 */
	<M> M get(Class<M> entityClass, Serializable id);

	/**
	 * 查询所有
	 * 
	 * @param entityClass
	 *            类型
	 * @return 返回的LIST
	 */
	<M> List<M> findAll(Class<M> entityClass);

	/**
	 * 删除所有
	 * 
	 * @param entityClass
	 */
	<M> Integer deleteAll(Class<M> entityClass);
}
